package com.czp.infosharingplatformapp.util;

import java.util.Map;

public class SimilarityUtil {

    public static double computeCosineSimilarity(Map<String, Integer> vector1, Map<String, Integer> vector2) {
        // Step 1: 计算点积
        double dotProduct = 0.0;
        for (String key : vector1.keySet()) {
            if (vector2.containsKey(key)) {
                dotProduct += vector1.get(key) * vector2.get(key);
            }
        }

        // Step 2: 计算两个向量各自的模（Euclidean 范数）
        double normA = 0.0;
        for (int value : vector1.values()) {
            normA += Math.pow(value, 2); // 平方和
        }
        normA = Math.sqrt(normA);

        double normB = 0.0;
        for (int value : vector2.values()) {
            normB += Math.pow(value, 2); // 平方和
        }
        normB = Math.sqrt(normB);

        // Step 3: 返回余弦相似度
        if (normA == 0.0 || normB == 0.0) {
            return 0.0; // 防止分母为零
        }
        return dotProduct / (normA * normB);
    }
}